﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PathUtil
//实用类/工具类，用于提供资源路径相关的属性/方法,实现复用，后期易于修改，单独职责原则
//不需要继承自mono，因为不需要挂载到游戏对象上
{
    //Assets根目录的路径
    public static readonly string AssetPath = Application.dataPath;
    //获取BuildResources文件夹的路径作为需要打包的资源的路径
    //！！！！！！！！！这里出错了，如果按照下面那么写，因为最后没有反斜杠，可能会在拼接和修剪路径时出问题
    //但是在buildtools中的Directory.GetFiles方法中，不带斜杠依然可以工作，因为会自动处理路径拼接问题
    //当涉及到自己进行字符串拼接的时候，最好加上斜杠
    //public static readonly string BuildResourcesPath = AssetPath + "/BuildResources";
    public static readonly string BuildResourcesPath = AssetPath + "/BuildResources/";
    //获取StreamingAssets文件夹的路径作为打包输出路径
    public static readonly string BundleOutPath = Application.streamingAssetsPath;
    //只读目录（用于首次安装检查，以及编辑器模式下的ab包读取）
    public static readonly string ReadOnlyPath = Application.streamingAssetsPath;
    //可读写目录（用于首次安装检查，以及客户端模式下的ab包更新写入及读取）
    public static readonly string ReadWritePath = Application.persistentDataPath;
    //LUA
    public static readonly string LuaPath = "Assets/BuildResources/LuaScripts";

    //bundle资源路径，用于更新后的解析版本文件 和 游戏运行时加载ab包。编辑器模式下的播放与打包发布后的执行的资源路径不同。
    //使用ReadWritePath而非Application.streamingAssetsPath的理由：不会频繁产生gc
    //只有启动客户端的时候，才是更新模式，路径为可读写的目录；其他情况（打包模式/编辑器模式）都是只读目录
    //在开发过程中 的 播放模式下，如果不需要测试更新流程，就选择编辑器模式：ab包都在只读目录中（这里的只读指的是打包发布后的只读），不需要更新，编辑期间读取ab包的资源路径就是该路径；
    //打包发布后，在目标平台运行时，即更新模式：更新需要一个可写入的目录，把ab包下载到可写目录 实现更新，打包发布后读取ab包的资源路径就是该路径；
    //作用:解耦，不需要在游戏开发运行与打包发布后运行对 解析版本文件 和 运行时加载ab包 的代码中的路径进行修改，直接在unity编辑器中切换gamemode的初始化值即可
    //
    public static string BundleResourcePath
    {
         get 
        { 
            if(AppConst.GameMode == GameMode.UpdateMode)
                return ReadWritePath;
            return ReadOnlyPath;
        }
    }

    //获取Unity的相对路径
    public static string GetUnityPath(string path)
    {
        if (string.IsNullOrEmpty(path))
            return string.Empty;
        return path.Substring(path.IndexOf("Assets"));
    }
    //处理拼接路径问题，修剪空格,替换反斜杠
    public static string GetStandardPath(string path)
    {
        if (string.IsNullOrEmpty(path))
            return string.Empty;
        return path.Trim().Replace("\\", "/");//先修剪空格？？再替换反斜杠（转义字符）
    }
    
    #region 资源路径获取函数
    //加载bunlde时，输入路径很不方便，所以需要方法来处理路径问题
    public static string GetLuaPath(string name)
    {
        return string.Format("Assets/BuildResources/LuaScripts/{0}.bytes", name);
    }
    public static string GetUIPath(string name)
    {
        return string.Format("Assets/BuildResources/UI/Prefabs/{0}.prefab", name);
    }
    public static string GetMusicPath(string name)
    {
        return string.Format("Assets/BuildResources/Audio/Music/{0}", name);
    }    
    public static string GetSoundPath(string name)
    {
        return string.Format("Assets/BuildResources/Audio/Sound/{0}", name);
    }    
    public static string GetEffectPath(string name)
    {
        return string.Format("Assets/BuildResources/Effect/Prefabs/{0}.prefab", name);
    }    
    public static string GetSpritePath(string name)
    {
        return string.Format("Assets/BuildResources/Sprites/{0}", name);
    }    
    public static string GetScenePath(string name)
    {
        return string.Format("Assets/BuildResources/Scenes/{0}.unity", name);
    }    
    public static string GetModelPath(string name)
    {
        return string.Format("Assets/BuildResources/Model/Prefabs/{0}.prefab", name);
    }
    #endregion 
}



